/*
* Copyright © Shanghai Awinic Technology Co., Ltd. 2020-2020. All rights reserved.
* Description: The header file of the GPIO related driver library.
* Date： 20201126
* Awinic_Version： aw_soc_driver_v1.0.0
*/
#include "compile_option.h"
#ifdef AW_86802

#ifndef __AW8680x_GPIO_H
#define __AW8680x_GPIO_H

/* Include ------------------------------------------------------------------*/
#include "aw8680x_def.h"

/**
 * @brief  GPIO status definition
**/
enum gpio_pin_status {
	GPIO_LOW = 0x00U,
	GPIO_HIGH = 0x01U,
};
typedef enum gpio_pin_status GPIO_PIN_STATE_E;

/**
 * @brief  GPIO mode definition
**/
enum gpio_mode {
	GPIO_INPUT = 0x00U,
	GPIO_OD_OUTPUT = 0x01U,
	GPIO_PA_OUTPUT = 0x02U,
	GPIO_EXTINT = 0x03U,
};
typedef enum gpio_mode GPIO_MODE_E;

/**
 * @brief  GPIO interruption mode definition
**/
enum gpio_ext_type {
	HIGH_LEVEL = 0x00U,
	LOW_LEVEL = 0x01U,
	RISING_EDGE = 0x02U,
	FALLING_EDGE = 0x03U,
};
typedef enum gpio_ext_type GPIO_EXT_TYPE_E;

/**
 * @brief  GPIO Initialization Configuration Structure definition
**/
struct gpio_init_struct {
	AW_U32 gpio_pin_mux;
	AW_U32 gpio_speed;
	AW_U32 gpio_pin;
	GPIO_MODE_E mode;
	GPIO_EXT_TYPE_E ext_type;
};
typedef struct gpio_init_struct GPIO_INIT_TYPE_S;

/**
 * @brief  GPIO Configuration Structure definition
**/
struct gpio_handle {
	IRQ_PRI_E gpio_irq_pri_e;			// GPIO irq priority
	GPIO_INIT_TYPE_S init_s;			// GPIO communication parameters
};
typedef struct gpio_handle GPIO_HANDLE_TYPE_S;

/**
 * @brief  GPIO pin definition
**/
#define GPIO_PIN_0		((AW_U32)0x00000001)
#define GPIO_PIN_1		((AW_U32)0x00000002)
#define GPIO_PIN_2		((AW_U32)0x00000004)
#define GPIO_PIN_3		((AW_U32)0x00000008)
#define GPIO_PIN_4		((AW_U32)0x00000010)
#define GPIO_PIN_5		((AW_U32)0x00000020)
#define GPIO_PIN_6		((AW_U32)0x00000040)
#define GPIO_PIN_7		((AW_U32)0x00000080)
#define GPIO_PIN_8		((AW_U32)0x00000100)
#define GPIO_PIN_9		((AW_U32)0x00000200)
#define GPIO_PIN_10		((AW_U32)0x00000400)
#define GPIO_PIN_11		((AW_U32)0x00000800)
#define GPIO_PIN_12		((AW_U32)0x00001000)
#define GPIO_PIN_13		((AW_U32)0x00002000)
#define GPIO_PIN_14		((AW_U32)0x00004000)
#define GPIO_PIN_15		((AW_U32)0x00008000)

/**
 * @brief  GPIO pin mux definition
**/
#define GPIO_PIN_MUX_0		((AW_U32)0x00000003)
#define GPIO_PIN_MUX_1		((AW_U32)0x0000000C)
#define GPIO_PIN_MUX_2		((AW_U32)0x00000030)
#define GPIO_PIN_MUX_3		((AW_U32)0x000000C0)
#define GPIO_PIN_MUX_4		((AW_U32)0x00000300)
#define GPIO_PIN_MUX_5		((AW_U32)0x00000C00)
#define GPIO_PIN_MUX_6		((AW_U32)0x00003000)
#define GPIO_PIN_MUX_7		((AW_U32)0x0000C000)
#define GPIO_PIN_MUX_8		((AW_U32)0x00030000)
#define GPIO_PIN_MUX_9		((AW_U32)0x000C0000)
#define GPIO_PIN_MUX_10		((AW_U32)0x00300000)
#define GPIO_PIN_MUX_11		((AW_U32)0x00C00000)
#define GPIO_PIN_MUX_12		((AW_U32)0x03000000)
#define GPIO_PIN_MUX_13		((AW_U32)0x0C000000)
#define GPIO_PIN_MUX_14		((AW_U32)0x30000000)
#define GPIO_PIN_MUX_15		((AW_U32)0xC0000000)

#define GPIO_SPEED_FAST		((AW_U32)0x00)
#define GPIO_SPEED_SLOW		((AW_U32)0x01)
#define SYS_PA_EN_MASK		(0x3FFF)

/* GPIO Check */
#define GPIO_CHECK_MODE(mode) (((mode) == GPIO_INPUT) || ((mode) == GPIO_OUTPUT) || ((mode) == GPIO_EXTINT))

/**
 * @brief  GPIO macro definition function
**/

/* GPIO output low or high state */
#define GPIO_SET_LOW(gpio_pin)			(GPIO->SWPOT_DR &= ~(gpio_pin))
#define GPIO_SET_HIGH(gpio_pin)			(GPIO->SWPOT_DR |= (gpio_pin))

/* Clear the existing interruption */
#define GPIO_CLEAN_MASK(gpio_pin)		(GPIO->POT_EOI |=(gpio_pin))

void gpio_set_mode(GPIO_MODE_E gpio_mode, AW_U32 gpio_pin);
GPIO_PIN_STATE_E gpio_get_state(AW_U32 gpio_pin);
RET_STATUS_E gpio_init(GPIO_HANDLE_TYPE_S *p_gpio_lib);
void gpio_irq(void);

#endif
#endif
